package com.lifp.thread.collection;

import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @Description TODO
 * @Author lfp
 * @Date 2022/7/25
 * @Version 1.0
 */
@Slf4j
public class ListDemo {

    public static void main(String[] args) {
        //arrayListDemo();

        //vectorDemo();

        //synchronizedListDemo();

        copyOnWriteArrayListDemo();
    }


    /**
    * 【ArrayList 线程不安全类】，会发生并发修改异常
    */
    public static void arrayListDemo(){
        //创建ArrayList集合
        List<String> list = new ArrayList<>();

        //循环创建多个线程去操作该集合
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }

    /**
     * 【Vector 线程安全类】
     */
    public static void vectorDemo(){
        //创建ArrayList集合
        List<String> list = new Vector<>();

        //循环创建多个线程去操作该集合
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }

    /**
     * 【Collections.synchronizedList】 转换为线程安全类
     */
    public static void synchronizedListDemo(){
        //创建ArrayList集合
        List<String> list = Collections.synchronizedList(new ArrayList<>());

        //循环创建多个线程去操作该集合
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }

    /**
     * 【CopyOnWriteArrayList】 写时复制，线程安全类
     */
    public static void copyOnWriteArrayListDemo(){
        //创建ArrayList集合
        List<String> list = new CopyOnWriteArrayList<>();

        //循环创建多个线程去操作该集合
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}
